package org.sample.commons;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by Alan.ye on 2017/5/16.
 */
public class DistanceUtils {

    /**
     * 地球的赤道半径
     */
    private static double EARTH_RADIUS = 6378137;


    /**
     * 根据两个位置的经纬度，来计算两地的距离（单位为M）
     * 参数为String类型
     *
     * @param lat1 用户纬度
     * @param lng1 用户经度
     * @param lat2 商家纬度
     * @param lng2 商家经度
     * @return double 单位 米（m）
     */
    public static Double calcDistance(Double lat1, Double lng1, Double lat2, Double lng2) {
        double radLat1 = Math.toRadians(lat1);
        double radLat2 = Math.toRadians(lat2);
        double difference = radLat1 - radLat2;
        double mDifference = Math.toRadians(lng1) - Math.toRadians(lng2);
        double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(difference / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(mDifference / 2), 2)));
        distance = distance * EARTH_RADIUS;
        distance = Math.round(distance * 10000) / 10000;
        return distance;
    }

    public static String showDistance(Double lat1, Double lng1, Double lat2, Double lng2) {
        if (lat1 == null || lng1 == null || lat2 == null || lng2 == null)
            return "未知距离";
        Integer distance = calcDistance(lat1, lng1, lat2, lng2).intValue();
        return show(distance);
    }

    /**
     * 获取当前用户一定距离以内的经纬度值
     * 单位米 return minLat
     * 最小经度 minLng
     * 最小纬度 maxLat
     * 最大经度 maxLng
     * 最大纬度 minLat
     */
    public static Map getAround(double latitude, double longitude, double raidusMile) {
        Map<String, String> map = new HashMap<>();
        Double degree = (24901 * 1609) / 360.0; // 获取每度

        Double mpdLng = Double.parseDouble((degree * Math.cos(latitude * (Math.PI / 180)) + "").replace("-", ""));
        Double dpmLng = 1 / mpdLng;
        Double radiusLng = dpmLng * raidusMile;
        //获取最小经度
        Double minLat = longitude - radiusLng;
        // 获取最大经度
        Double maxLat = longitude + radiusLng;

        Double dpmLat = 1 / degree;
        Double radiusLat = dpmLat * raidusMile;
        // 获取最小纬度
        Double minLng = latitude - radiusLat;
        // 获取最大纬度
        Double maxLng = latitude + radiusLat;

        map.put("minLat", minLat + "");
        map.put("maxLat", maxLat + "");
        map.put("minLng", minLng + "");
        map.put("maxLng", maxLng + "");

        return map;
    }

    private static String show(Integer distance) {
        StringBuilder result = new StringBuilder();
        if (distance < 1000)
            result.append(distance).append("m");
        else
            result.append(Math.ceil(distance * 10 / 1000) / 10).append("km");
        return result.toString();
    }

}